package com.curry.log.dervice;

import android.app.Activity;
import android.content.Context;
import android.content.pm.PackageManager;
import android.telephony.TelephonyManager;
import android.util.DisplayMetrics;



public class Environment {

	public TelephonyManager telMngr;
	public PackageManager pacMngr;
	/* ========== Variables ========== */
	/** 运营商名称 */
	public String networkOperator;
	/**
	 * 网络类型
	 * <ul>
	 * <li>NETWORK_TYPE_CDMA 网络类型为CDMA</li>
	 * <li>NETWORK_TYPE_EDGE 网络类型为EDGE</li>
	 * <li>NETWORK_TYPE_EVDO_0 网络类型为EVDO0</li>
	 * <li>NETWORK_TYPE_EVDO_A 网络类型为EVDOA</li>
	 * <li>NETWORK_TYPE_GPRS 网络类型为GPRS</li>
	 * <li>NETWORK_TYPE_HSDPA 网络类型为HSDPA</li>
	 * <li>NETWORK_TYPE_HSPA 网络类型为HSPA</li>
	 * <li>NETWORK_TYPE_HSUPA 网络类型为HSUPA</li>
	 * <li>NETWORK_TYPE_UMTS 网络类型为UMTS</li>
	 * </ul>
	 * 在中国，联通的3G为UMTS或HSDPA，移动和联通的2G为GPRS或EGDE，电信的2G为CDMA，电信的3G为EVDO
	 */
	public int networkType;
	/**
	 * 移动终端的类型
	 * <ul>
	 * <li>PHONE_TYPE_CDMA 手机制式为CDMA，电信</li>
	 * <li>PHONE_TYPE_GSM 手机制式为GSM，移动和联通</li>
	 * <li>PHONE_TYPE_NONE 手机制式未知</li>
	 * </ul>
	 */
	public int phoneType;

	public String mobilePhone;
	/*** 如果是GSM网络，返回IMEI；如果是CDMA网络，返回MEID */
	public String deviceID;
	/**
	 * IMEI：(International Mobile Equipment
	 * Identity)是国际移动设备身份码的缩写，国际移动装备辨识码，是由15位数字组成的
	 * "电子串号"，它与每台手机一一对应，而且该码是全世界唯一的。每一只手机在组装完成后都将被赋予一个全球唯一的一组号码
	 * ，这个号码从生产到交付使用都将被制造生产的厂商所记录。
	 */
	public String IMEI;
	/**
	 * InternationalMobileSubscriberIdentificationNumber）国际移动用户识别码，是区别移动用户的标志，
	 * 储存在SIM卡中 ，可用于区别移动用户的有效信息。其总长度不超过15位，同样使用0～9的数字。其中MCC是移动用户所属国家代号，占3位数字，
	 * 中国的MCC规定为460
	 * ；MNC是移动网号码，最多由两位数字组成，用于识别移动用户所归属的移动通信网；MSIN是移动用户识别码，用以识别某一移动通信网中的移动用户
	 */
	public String IMSI;

	/* ===== 手机型号信息 ===== */
	/**
	 * 手机型号
	 */
	public String model = android.os.Build.MODEL;

	/* ===== 手机OS信息 ===== */

	/** Android操作系统版本 */
	public int osLevel = android.os.Build.VERSION.SDK_INT;

	/* ===== 手机显示信息 ===== */
	public int dispDpi;
	/** 屏幕高度 */
	public int dispHeight;
	/** 屏幕宽度 */
	public int dispWidth;

	/* ===== App信息 ===== */
	/** 应用包名：辨识应用的唯一识别名 */
	public String appPackage;

	private static Environment env;
	
	public TelephonyManager getTelMngr() {
		return telMngr;
	}

	public PackageManager getPacMngr() {
		return pacMngr;
	}

	public String getNetworkOperator() {
		return networkOperator;
	}

	public int getNetworkType() {
		return networkType;
	}

	public int getPhoneType() {
		return phoneType;
	}

	public String getMobilePhone() {
		return mobilePhone;
	}

	public String getDeviceID() {
		return deviceID;
	}

	public String getIMEI() {
		return IMEI;
	}

	public String getIMSI() {
		return IMSI;
	}

	public String getModel() {
		return model;
	}

	public int getOsLevel() {
		return osLevel;
	}

	public int getDispDpi() {
		return dispDpi;
	}

	public int getDispHeight() {
		return dispHeight;
	}

	public int getDispWidth() {
		return dispWidth;
	}

	public String getAppPackage() {
		return appPackage;
	}

	public static Environment getSingleton(){
		if(env==null){
			env=new Environment();
		}
		return env;
	}
	
	/* ========== Constructor ========== */
	public void setEnvironment(Context context) throws NullPointerException {
		/* ===== STEP 0. Input Protection ===== */
		if (null == context)
			throw new NullPointerException();
		/* ===== STEP 1. Store System Utilities ===== */
		this.telMngr = (TelephonyManager) context
				.getSystemService(Context.TELEPHONY_SERVICE);
		this.pacMngr = (PackageManager) context.getPackageManager();

		/* ===== STEP 2. Invariant information ===== */
		/* ===== Device Information ===== */
		this.mobilePhone = telMngr.getLine1Number();
		this.deviceID = telMngr.getDeviceId();
		this.networkOperator = telMngr.getNetworkOperatorName();
		this.networkType = telMngr.getNetworkType();
		this.phoneType = telMngr.getPhoneType();
		this.IMEI = telMngr.getSimSerialNumber();
		this.IMSI = telMngr.getSubscriberId();
		/* ===== Android OS Information ====== */
		
		/* ===== Display Information ===== */
		DisplayMetrics dispMetrics = new DisplayMetrics();
		((Activity) context).getWindowManager().getDefaultDisplay().getMetrics(dispMetrics);
		this.dispDpi = dispMetrics.densityDpi;
		this.dispHeight = dispMetrics.heightPixels;
		this.dispWidth = dispMetrics.widthPixels;
		/* ===== ===== */
		
		
	}
	
	public void setEnvListener(EnvListener envListener){
		if(envListener!=null){
			envListener.request(env);
		}
	}
	public EnvListener envListener=null;
	
	public interface EnvListener{
		public void request(Environment env);
	}
	
	
}
